import re
from typing import Union, Tuple, List, Dict

from .schema import SummaryTable, BidTable, SummaryProduct, ExceptionProduct


def normalize_key(name: str, spec: Union[int, str]) -> Tuple[str, str]:
    """
    归一化产品键 (name, spec)，支持中英文括号
    - name: 字符串，转小写 + 去空格
    - spec: int 或 str，统一转为标准化字符串
    """
    # 归一化 key_name
    norm_name = name.strip().lower()

    # 归一化 key_spec
    if isinstance(spec, int):
        norm_spec = str(spec)
    elif isinstance(spec, str):
        s = spec.strip()

        # 使用正则提取第一个括号前的内容（支持中英文括号）
        # 匹配：从开头到遇到第一个 ( 或 （ 之前的内容
        match = re.match(r"^([^(（]*)", s)
        if match:
            main_part = match.group(1).strip()
        else:
            main_part = s

        # 可选：进一步清理
        # 移除末尾可能的分数，如 "1 1/4"
        main_part = re.sub(r"\s*\d+/\d+\s*$", "", main_part)
        # 去除多余空白
        main_part = re.sub(r"\s+", "", main_part)

        norm_spec = main_part
    else:
        norm_spec = str(spec).strip().lower()

    return norm_name, norm_spec


def add_supplier(summary_table: SummaryTable, bid_table: BidTable) -> SummaryTable:
    # 构建 product_map 和 index_pointers，使用归一化后的 key
    product_map: Dict[Tuple[str, str], List[SummaryProduct]] = {}
    index_pointers = {}

    for product in summary_table.products:
        key = normalize_key(product.key_name, product.key_spec)
        if key not in product_map:
            product_map[key] = []
            index_pointers[key] = 0
        product_map[key].append(product)

    # 遍历投标产品
    for bid_product in bid_table.products:
        key = normalize_key(bid_product.key_name, bid_product.key_spec)

        if key in product_map:
            idx = index_pointers[key]
            if idx < len(product_map[key]):
                matched_product = product_map[key][idx]
                matched_product.offers.append(bid_product.offer)
                index_pointers[key] += 1
            else:
                # 当前 key 的所有 summary 产品都已匹配完
                exception_product = ExceptionProduct(
                    key_name=bid_product.key_name,
                    key_spec=bid_product.key_spec,
                    offer=bid_product.offer,
                    detail=bid_product.detail,
                )
                if exception_product.offer.detail.remark is None:
                    exception_product.offer.detail.remark = ""

                exception_product.offer.detail.remark += f"【原因】过多的重复项，位于原投标表第{bid_table.products.index(bid_product) + 3}行。"
                summary_table.exceptions.append(exception_product)
        else:
            # 完全不匹配
            exception_product = ExceptionProduct(
                key_name=bid_product.key_name,
                key_spec=bid_product.key_spec,
                offer=bid_product.offer,
                detail=bid_product.detail,
            )
            original_row_idx = (
                bid_table.products.index(bid_product) + 3
            )  # 假设表头占2行

            if exception_product.offer.detail.remark is None:
                exception_product.offer.detail.remark = ""  # 初始化为空字符串

            exception_product.offer.detail.remark += (
                f"【原因】无匹配项，位于原投标表第{original_row_idx}行。"
            )
            summary_table.exceptions.append(exception_product)

    return summary_table
